package com.phenix.mvp.base.multitype;

import android.support.annotation.NonNull;

/**
 * 数据扁平化处理
 * @author  zhouphenix on 2017-1-8.
 * 在一个垂直 RecyclerView 中，item 们都是同级的，没有任何嵌套关系，但我们的数据结构往往存在嵌套关系，比如 Post 内部包含了 Comments 数据，
 * 或换句话说 Post 嵌套了 Comment，就像微信朋友圈一样，"动态" 伴随着 "评论"。那么如何把 非扁平化 的数据排布在 扁平 的列表中呢？必然需要一个数据扁平化处理的过程，
 * 就像 ListView 的数据需要一个 Adapter 来适配，Adapter 就像一个油漏斗，把油引入瓶子中。我们在面对嵌套数据结构的时候，可以采用如下的扁平化处理，关于扁平化这个词，
 * 不必太纠结，简单说，就是把嵌套数据都拉出来，摊平，让 Comment 和 Post 同级，最后把它们都 add 进同一个 Items 容器，交给 MultiTypeAdapter. 示例：
 * 假设：你的 Post 是这样的：
 * public class Post {
 * public String content;
 * public List<Comment> comments;
 * }
 * 假设：你的 Comment 是这样的：
 * public class Comment {
 * public String content;
 * }
 * 假设：你服务端返回的 JSON 数据是这样的：
 * <pre>
 * [
 *  {
 *      "content":"I have released the MultiType v2.2.2",
 *      "comments":[
 *          {"content":"great"},
 *          {"content":"I love your post!"}
 *        ]
 *   }
 * ]
 * </pre>
 * 那么你的 JSON 转成 Java Bean 之后，你拿到手应该是个 List<Post> posts 对象，现在我们写一个扁平化处理的方法：
 * <pre>
 * private List<Object> flattenData(List<Post> posts) {
 *  final List<Object> items = new ArrayList<>();
 *  for (Post post : posts) {
 * //将 post 加进 items，Provider 内部拿到它的时候，
 * // 我们无视它的 comments 内容即可
 *      items.add(post);
 * //紧接着将 comments 拿出来插入进 items，
 * //评论就能正好处于该条 post 下面
 *      items.addAll(post.comments);
 * }
 *  return items;
 * }
 * </pre>
 * 最后我们所有的 posts 在加入全局 MultiType Items 之前，都需要经过扁平化处理：
 * <pre>
 *      items.addAll(flattenData(posts));
 *      adapter.notifyDataSetChanged();
 * </pre>
 */

public interface FlatTypeAdapter<T, V> {
    Class<?> onFlattenClass(@NonNull T o);

    V onFlattenItem(@NonNull T o);
}
